// ============================================================================ //
// || || //
// || International University of Business Agriculture || //
// || and Technology, DHaka, Bangladesh || //
// || Emrul Hasan Emon || //
// || || //
// ============================================================================ //
/// B I S M I L L A H I R R A H M A N I R R A H I M
#include<bits/stdc++.h>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef bool boo;
typedef int li;
typedef long long int ll;
typedef unsigned long long int lu;
typedef double db;
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
typedef vector < li > vli;
typedef vector < ll > vll;
typedef set < li > sli;
typedef set < ll > sll;
typedef pair < pair<li, li>, li> PLL;
typedef pair < ll, ll > pll;
typedef map < li,li > mli;
typedef map < ll,ll > mll;
typedef vector < pair < li, li > > vpi;
typedef vector < pair < ll, ll > > vpl;
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#define tc int t;cin>>t;while(t--)
#define inp_i(a,n) for(i=0; i<n ;i++) cin>>a[i]
#define out_i(a, b, c) for(i=b; i<c; i++) cout<<a[i] spc; cout nl;
#define lp(i,a,b) for(i=a;i<b;i++)
#define len(z) z.begin(),z.end()
#define faster ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
#define input_txt freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#define nl <<"\n"
#define spc <<" "
#define sp <<" "<<
#define co(x) cout<<x nl
#define sz(a) a.size()
#define cy cout<<"YES" nl
#define cn cout<<"NO" nl
#define pb push_back
#define F first
#define S second
#define pi 2*acos(0.0)
#define clr(z) z.clear()
#define rn return
#define gcd(a,b) __gcd(a,b)
#define mem(b,z) memset(b,z,sizeof(b))
#define fixed(x) fixed<<setprecision(x)
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
template<typename T>
using ordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
const double inf = 0.0000;
const int lx = 2e5 + 23;
const int mod = 1e9 + 7;
const int mxm = 1e8 + 3;
void solve()
{
int n, d, i;
cin >> n >> d;
map<pair<string, string>, vector<int> > msg;
map<pair<string, string>, int> frnd;
frnd.clear();
msg.clear();
for(i = 0; i < n; i++)
{
string u, v;
int t;
cin >> u >> v >> t;
if(frnd[{u, v}] or frnd[{v, u}]) continue;
msg[{u, v}].push_back(t);
int s1 = msg[{u, v}].size();
int s2 = msg[{v, u}].size();
for(int j = 0; j < s2; j++)
{
int x = msg[{v, u}][j];
if(x < t and t-x <= d)
{
frnd[{u, v}]++;
}
}
}
int ans = 0;
for(auto it : frnd) if(it.S > 0) ans++;
cout << ans << '\n';
for(auto it: frnd)
{
if(it.S > 0) cout << it.F.F << " " << it.F.S << '\n';
}
}
void init_code()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
}
int main()
{
faster
solve();
// A L H A M D U L I L L A H
// 1 2 3 2 1
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*
bool mark[lx];
vector<int> primes;
void sieve()
{
mark[0] = mark[1] = true;
for(int i = 3; i*i <= lx; i++)
{
if(!mark[i])
{
for(int j = i*i; j < lx; j += i)
mark[j] = true;
}
}
primes.push_back(2);
for(int i = 3; i < lx; i += 2)
{
if(!mark[i])
{
primes.push_back(i);
}
}
}
*
ll Big_Mod(ll a, ll b)
{
if(!b) return 1;
ll ans = Big_Mod(a, b/2);
ans %= mod;
ans *= ans;
ans %= mod;
if(b&1)
{
a %= mod;
ans *= a;
ans %= mod;
}
return ans;
}
*
ll fact(ll n)
{
ll ans=1;
for(ll i=1; i<=n; i++)
ans=(ans*i)%mod;
return ans;
}
ll nCr(ll n, ll k)
{
return fact(n)*1ll*Big_Mod(fact(k), mod-2)%mod*1ll*Big_Mod(fact(n-k), mod-2)%mod;
}
ll gcd(ll a, ll b)
{
if (a == 0)
return b;
return gcd(b % a, a);
}
void number_of_divisors(li n)
{
//Number of divisors of every number between 1 to n
for(li i = 1; i*i <= n; i++)
{
for(li j = i*i; j <= n; j += i)
{
if(i*i == j)
a[j]++;
else
a[j] += 2;
}
}
}
void sum_of_divisor()
{
for(li i = 1; i * i <= 1e7; i++)
{
for(li j = i*i; j < 1e7; j += i)
{
if(j == i*i)
a[j] += i;
else
a[j] += i+(j/i);
}
}
}
*/
222. Count Complete Tree Nodes | 215. Kth Largest Element in an Array |
198. House Robber | 153. Find Minimum in Rotated Sorted Array |
150. Evaluate Reverse Polish Notation | 144. Binary Tree Preorder Traversal |
137. Single Number II | 130. Surrounded Regions |
129. Sum Root to Leaf Numbers | 120. Triangle |
102. Binary Tree Level Order Traversal | 96. Unique Binary Search Trees |
75. Sort Colors | 74. Search a 2D Matrix |
71. Simplify Path | 62. Unique Paths |
50. Pow(x, n) | 43. Multiply Strings |
34. Find First and Last Position of Element in Sorted Array | 33. Search in Rotated Sorted Array |
17. Letter Combinations of a Phone Number | 5. Longest Palindromic Substring |
3. Longest Substring Without Repeating Characters | 1312. Minimum Insertion Steps to Make a String Palindrome |
1092. Shortest Common Supersequence | 1044. Longest Duplicate Substring |
1032. Stream of Characters | 987. Vertical Order Traversal of a Binary Tree |
952. Largest Component Size by Common Factor | 212. Word Search II |